﻿	 /**
	   SignedData
     简介:
	   SignedData也是加密消息语法的一种，其主要是把签名值和签名使用的相关信息组合在一起方便验证。
	   SignedData签名通常分为两种：一种是带明文的签名，一种是不带明文的前面。前者会因为明文的增大而增大，但是方便进行验证，
	   验证通过后可以得到明文。后者比较小，但验证时需要能够构造出明文才行。
     **/



	/*
	signeddata 签名
	*/

	function JSTest_SignedData_Sign()
	{
	
			/*
		    localCacheICert 是一个certificate的javascript对象
		    */

			if(localCacheICert==null)
			{
				alert("先选择签名的证书");
				return;
			}
	 
	        			
			//signeddata其他相关配置参考全局配置信息
			//使用NetcaPKI 的 signedDataSign 方法进行签名，参数是certificate，是否带原文,签名原文
			//签名结果是字节数组
			var signVar= NetcaPKI.signedDataSign(localCacheICert,parseInt(signedDataDetach.value),SignedDataTBS.value);  
			if(NetcaPKI.getLastError()!=NetcaPKI.OK)
            {
                alert(NetcaPKI.getLastErrorMsg());
				return;
            }  

            //将字节数组转换成base64编码
            //base64编码使用NetcaPKI 的base64Encode方法
			var base64String= NetcaPKI.base64Encode(signVar);
		    SignedDataPVAL.value=base64String;
	 
		
	}


	/*
	signeddata 签名附加时间戳
	*/

	function JSTest_SignedData_AttachTimeStamp()
	{
		
			/*
			   附加时间戳只需调用NetcaPKI的signedDataAttachTimeStamp方法
			   但是必须在signedDataSign后或者signedDataVerify后才能使用
			*/
			
			/*
			   返回字节数组类型的签名值
			*/
			var signature=NetcaPKI.signedDataAttachTimeStamp();		
			if(NetcaPKI.getLastError()!=NetcaPKI.OK)
            {
                alert(NetcaPKI.getLastErrorMsg());
				return;
            }  
            
            //将字节数组转换成base64编码
            //base64编码使用NetcaPKI 的base64Encode方法
			var  base64String= NetcaPKI.base64Encode(signature);
		    SignedDataAttachTimeStampSignature.value=base64String;
	}

    /*
	signeddata 验证，包含带原文,不带原文验证。
	*/

	function JSTest_SignedData_Verify()
	{
			 	
				//判断signeddata是否包含原文
				var signeddataObject= NetcaPKI._baseObject.CreateSignedDataObject();
				var ok=signeddataObject.IsDetachedSign(SignedDataSignature.value);
				if(!ok)
				{
					alert("SignedData数据带原文!");
				}
				else
				{
				  alert("SignedData数据不带原文!");
				}
	  
	            //提供原文的验证方法
				if(SignedDataVerifyTBS.value!="") 
				{
					//如果签名是base64编码的话，解码成字节数组
					var signature=NetcaPKI.base64Decode(SignedDataSignature.value);
					//签名值输入是字节数组
					var signVar= NetcaPKI.signedDataVerify(SignedDataVerifyTBS.value,signature);    
					if(signVar==1)
					{
						alert("验证签名成功!");
					}
					else
					{
					alert("验证签名失败!");
					}
				}
				else
				{
					
					//不提供原文，签名带原文 的验证方法
					//如果签名是base64编码的话，解码成字节数组
					var signature=NetcaPKI.base64Decode(SignedDataSignature.value);

					//签名值输入是字节数组
					var VerifyRet=signeddataObject.Verify(signature,false);
					if(NetcaPKI.getLastError()!=NetcaPKI.OK)
					{
						alert(NetcaPKI.getLastErrorMsg());
						return;
					}
				
				    //获取原文数据 这里将UTF8转成字符串，如果实际的签名原文不是UTF8，根据实际编码进行转换
					var  clearText= NetcaPKI.newString(VerifyRet);
					SignedDataVerifyTBS.value=clearText;
				}
				
			
		}
     
        /*
		   获取signedata时间戳的时间
		*/
		function JSTest_SignedData_GetTimeStampTime()
		{
			
			/*
			   获取签名里面的时间戳时间
			   使用NetcaPKI signedDataGetTimeStamp的方法
			*/
	         
			 var time=NetcaPKI.signedDataGetTimeStamp();
			 if(NetcaPKI.getLastError()!=NetcaPKI.OK)
             {
                alert(NetcaPKI.getLastErrorMsg());
				return;
             }  

             //成功返回SignedData签名的时间戳时间，Date类型
		 	 SignedDataGetTimeStampTimeTime.value=time;			
			 
		}

         /*
		   获取signedata里面的签名证书
		*/

		function JSTest_SignedData_GetSignCert()
		{
			
				/*
				   获取签名里面的时间戳时间
				   使用NetcaPKI signedDataGetSignCert的方法
				*/
		        var SignCert=NetcaPKI.signedDataGetSignCert();
				if(NetcaPKI.getLastError()!=NetcaPKI.OK)
	            {
	                alert(NetcaPKI.getLastErrorMsg());
					return;
	            }  

	            //获取证书的base64编码
				var Enccode= SignCert.encode(NetcaPKI.CERT_ENCODE_BASE64_NO_NL);    
			    SignedDataGetSignCertEncode.value=Enccode;

			    //显示证书
				SignCert.display();
		
		}